Usability and marketability of a software application are often judged by the number of different environments that the application can execute in. The different environments include different types of hardware platforms, operating systems, input/output (I/O) devices, user defined preferences, etc.
Software applications are conventionally built in development environments as a whole monolithic program or as a collection of smaller units such as code modules, static or dynamic libraries, or software components. One difficulty with this approach is that everything in the application needs to be completed and perfected in the development environment. Unfortunately, the running conditions or runtime environments are often highly diverse, and are increasing in number with the continual introduction of new devices. Thus, applications have become very complex in order to contain various types of intelligent logic to predict and react to the expected environment conditions. This increased complexity increases the cost of application development, and at some point, it may not be practicable to have an application that “knows” in advance all of the environments that the application could execute in.
The problem is further amplified by application development cycles becoming shorter and shorter, and by the fact that an “escaped” defect in an application identified in the field is difficult to debug and expensive to remedy. With software components becoming more popular, the problem is further multiplied. This is because when software components are integrated in the development environment into an application, it is difficult to test the software components for all possible runtime environments. Even if this can be accomplished, the developed application might need to be modified with a new platform, for example, another device to run the application is introduced.
In view of the above difficulties and complexities with traditional application development, a new design perspective is believed needed for shifting from the complete application control of the development environment to enabling an application to explore and adapt to a runtime environment. The present invention is directed to providing such a design shift.